import re
import xlwt
from selenium import webdriver
import time

class QCWY:

    def __init__(self,keyword,city,maxpagenum):
        self.keyword = keyword
        self.city = city
        self.maxpagenum = maxpagenum

    def run(self):

        #
        option = webdriver.ChromeOptions()
        option.add_argument('headless')  # 静默模式
        driver = webdriver.Chrome(options=option)

        #driver = webdriver.Chrome()
        driver.get('http://www.51job.com')
        driver.implicitly_wait(10)
        #输入关键字
        driver.find_element_by_id('kwdselectid').send_keys(self.keyword)

        #选择城市
        driver.find_element_by_id('work_position_input').click()
        time.sleep(1)
        #先删除默认选中
        selectedCityEles = driver.find_elements_by_css_selector('#work_position_click_multiple_selected > span')
        for selectedCityEle in selectedCityEles:
            selectedCityEle.click()

        #选择城市
        cityEles = driver.find_elements_by_css_selector('#work_position_click_center_right_list_000000 em')

        target = None

        while target == None:
            for cityEle in cityEles:
                if self.city == cityEle.text:
                    target = cityEle
                    break

            if target == None:
                self.city = input(f'{self.city}不在热门城市列表中，请重新输入(输入完加回车)')
            else:
                target.click()

        #点击确定
        driver.find_element_by_id('work_position_click_bottom_save').click()

        #点击搜索
        driver.find_element_by_css_selector('.ush > button').click()

        #得到最大页数
        # 判断是否到了最后一页,搜索最大值re.findall('(\w*[0-9]+)\w*', driver.find_element_by_xpath('/html/body/div[2]/div[3]/div/div[2]/div[4]/div[2]/div/div/div/span[1]').text)
        num = re.findall('(\w*[0-9]+)\w*', driver.find_element_by_xpath(
            '/html/body/div[2]/div[3]/div/div[2]/div[4]/div[2]/div/div/div/span[1]').text)  # 提取列表中的数字，这里得到的是一个列表并且列表中的数字是字符类型
        num = list(map(int, num))  # 将列表中的字符串类型变成数字类型

        # 放到excl表格中
        # 创建一个workbook 设置编码
        workbook = xlwt.Workbook(encoding='utf-8')
        # 创建一个worksheet
        worksheet = workbook.add_sheet('QCWY',cell_overwrite_ok=True)
        # 写入excel
        # 参数对应 行, 列, 值
        worksheet.write(0, 0, label='职位')
        worksheet.write(0, 1, label='发布时间')
        worksheet.write(0, 2, label='薪水待遇')
        worksheet.write(0, 3, label='公司名称')

        i = 1
        for pageNo in range(1,self.maxpagenum+1):
            driver.find_element_by_id('jump_page').click()
            driver.find_element_by_id('jump_page').clear()
            driver.find_element_by_id('jump_page').send_keys(pageNo)
            driver.find_element_by_class_name('og_but').click()
            time.sleep(1)
            #对每一个页面进行操作
            jobs = driver.find_elements_by_css_selector('.j_joblist > .e')#下面的for对当页进行打印
            for job in jobs:
                # 这是职位的
                position = job.find_element_by_css_selector('.j_joblist > .e >a >.t > span:nth-child(1)')
                # 这是发布时间
                release_time = job.find_element_by_css_selector('.j_joblist > .e >a >.t > span:nth-child(2)')
                # 这是薪水
                salary = job.find_element_by_css_selector('.j_joblist > .e > a > .info > .sal')
                # 公司名称
                corporate_name = job.find_element_by_css_selector('.j_joblist >.e > .er > a')

                # 写入excel
                # 参数对应 行, 列, 值
                worksheet.write(i, 0, label=position.text)
                worksheet.write(i, 1, label=release_time.text)
                worksheet.write(i, 2, label=salary.text)
                worksheet.write(i, 3, label=corporate_name.text)
                i = i+1
                # 打印出来
                print(position.text, release_time.text, salary.text, corporate_name.text)
            if pageNo == self.maxpagenum:  #一样的，当爬到的页数是当前的一页时候，结束（不是全部哈，下面那个才是全部）
                print('搜索完毕')
                # 保存
                workbook.save('前程无忧招聘信息.xls')
                break


            if pageNo == num[0]:
                print('搜索完毕')
                # 保存
                workbook.save('前程无忧招聘信息.xls')
                break


    #对一个页面进行输出
    # def onepageshow(self,driver):
    #     # 处理每一页的线性
    #     jobs = driver.find_elements_by_css_selector('.j_joblist > .e')
    #     for job in jobs:
    #         # 这是职位的
    #         position = job.find_element_by_css_selector('.j_joblist > .e >a >.t > span:nth-child(1)')
    #         # 这是发布时间
    #         release_time = job.find_element_by_css_selector('.j_joblist > .e >a >.t > span:nth-child(2)')
    #         # 这是薪水
    #         salary = job.find_element_by_css_selector('.j_joblist > .e > a > .info > .sal')
    #         # 公司名称
    #         corporate_name = job.find_element_by_css_selector('.j_joblist >.e > .er > a')
    #         # 打印出来
    #         print(position.text, release_time.text, salary.text, corporate_name.text)

 # #放到excl表格中
            # # 创建一个workbook 设置编码
            # workbook = xlwt.Workbook(encoding='utf-8')
            # # 创建一个worksheet
            # worksheet = workbook.add_sheet('My Worksheet')

            # 写入excel
            # 参数对应 行, 列, 值
            # worksheet.write(1, 0, label='this is test')
            #
            # # 保存
            # workbook.save('前程无忧招聘信息.xls')

print('这里是前程无忧爬虫系统，通过关键字，城市，搜索界面的最大页数来生成招聘信息excel表，')
msg = input('输入搜索的关键字（比如python输入完按回车）')
city = input('输入城市（比如上海输入完按回车）')
wangtpage = input('输入想要爬到的最大页数（不输入值默认全部,你最好给我输入1不然卡得很，输入完按回车）')
while True:
    if wangtpage == '':
        wangtpage = 100000000
        break
    try:
        wangtpage = int(wangtpage)
        break
    except:
        wangtpage = input('想要爬到的最大页数请输入正整数,或者不输入值（即爬取全部页）')

print('....................................')
print('别急一会就生成excel表格，正在抓取信息......')
print('....................................')
print('')
print('....................................')
print('在等一会')
print('....................................')
QCWY(msg,city,wangtpage).run()
